/** 
 *  泛型其实就是  类型参数化
 * 
 *      有时候，我们在定义一个数据结构的时候，并不清楚将来这个数据是什么类型，希望将来使用的时候才确定
 *      在使用这个类型的时候，再告诉ts进行推导就行
 * 
 * 
 *  以前发请求的时候
 *      请求返回的数据主要有三大块
 *          {
 *              code : number ;
 *              message : string ;
 *              data : ?  data的类型无法确定，不同的接口，返回的data是不一样，可能是 null ， 可能是 boolean ，也可以是对象，还可能是数组
 *          }
 * 
 * 难道在请求的时候，data是any? 不对！！！
 * 此时就是在我们使用到这个data的时候，再确定这个data是什么类型 ----> 泛型的使用场景
 * 
 *  泛型的语法
 *      类型<T,...> {
 *          属性:T,
 *      }
*/

// 比如：
// interface IExample1<T,N,M> {
//     // data的类型不能确定
//     data: T,
//     data2: N,
//     data3:M
// }

// let obj1:IExample1<string,string,boolean> = {
//     data:"abc",
//     data2:"def",
//     data3:true
// }

// let obj2:IExample1<number> = {
//     data:1
// }

// 将来我们想确定请求回来的数据是什么类型
interface IResponse<T> {
    code : number;
    message : string;
    data : T;
}

